import numpy as np              
import matplotlib.pyplot as plt 

N = 100  # number of samples                      
X = np.linspace(0,10,N)       
y = 0.8*X + np.random.randn(N)  
for i in range(1,4):
    y[-i]+=20-i   # inserting outliners

#appending bias. The first coefficient must not been regularized
X = np.vstack([np.ones(N), X]).T       

for alpha,color,label in zip([0,1000],['k','red'],['not
                             regularized','alpha = 1000']): 
    # Ridge regression
    #w = np.linalg.pinv((np.dot(X.T, X)+alpha*np.eye(2)))@np.dot(X.T, y)    
    w = np.linalg.pinv((X.T@X+alpha*np.eye(2)))@X.T@y    
    y_result = X@w 
    plt.plot(X[:,1],y_result, color=color, label=label)
    print(w)
    
plt.scatter(X[:,1], y, color='y')
plt.title('Ridge Regression')
plt.legend();plt.grid()
plt.show()
